#!/bin/bash

#----------------------------------------------------------------------------------------------------------------------
#
# Verificación de variables de entorno 
#
#----------------------------------------------------------------------------------------------------------------------
if [ -z "${GRUPO}" -o -z "${BINDIR}" ]; then
        source Grabar_L
	source Mover_B
else
        auxDir="${GRUPO}/${BINDIR}"
        source "${auxDir}"/Grabar_L
	source "${auxDir}"/Mover_B
fi


#----------------------------------------------------------------------------------------------------------------------
#
# Path Locales
#
#----------------------------------------------------------------------------------------------------------------------

MAEOBRAS="obras.mae"
MAESALAS="salas.mae"
COMBOS="combos.dis"
RESERVAOK="reservas.ok"
RESERVANOK="reservas.nok"
RESEROK="$PROCDIR/$RESERVAOK"
RESERNOK="$PROCDIR/$RESERVANOK"

#----------------------------------------------------------------------------------------------------------------------
#
# Funciones Locales
#
#----------------------------------------------------------------------------------------------------------------------
writereservasok(){
# Funcion que escribe un registro en el archivo reserva.ok
# Parametros de entrada
# $1 - Id de la Obra
# $2 - Nombre de la Obra
# $3 - Registro de Reserva
# $4 - Id de la Sala
# $5 - Nombre de la Sala
# $6 - Cantidad de Butacas confirmadas
# $7 - Id del Combo
# $8 - Correo del Solicitante
# $9 - Usuario de Grabacion

#Se arma el registro a guardar en el archivo reserva.ok
	day=`echo $3 | cut -d';' -f2`
	time=`echo $3 | cut -d';' -f3`	
	ref=`echo $3 | cut -d';' -f1`	
	soli=`echo $3 | cut -d';' -f6`	
	log=`date +'%d/%m/%Y'`
	usu=`whoami`	
	register="$1;$2;$day;$time;$4;$5;$6;$7;$ref;$soli;$8;$log;$usu"
	
# Se valida si existe el archivo reserva.ok, si no existe se lo crea	
	if [ -f "$GRUPO/$RESERVAOK" ];then
		echo $register >"$GRUPO/$RESEROK"	
	else
		echo $register >>"$GRUPO/$RESEROK"	
	fi
}

writereservasnok(){
# Funcion que escribe un registro en el archivo reserva.nok
# Parametros de entrada 
# $1 - Registro de Reserva
# $2 - Motivo de Rechazo
# $3 - Id de la Sala
# $4 - Id de la Obra
# $5 - Correo del Solicitante
# $6 - Usuario de Grabacion

#Se arma el registro a guardar en el archivo reserva.nok
	ref=`echo $1 | cut -d';' -f1`
	day=`echo $1 | cut -d';' -f2`
	time=`echo $1 | cut -d';' -f3`
	fil=`echo $1 | cut -d';' -f4`
	col=`echo $1 | cut -d';' -f5`
	soli=`echo $1 | cut -d';' -f6`
	sec=`echo $1 | cut -d';' -f7`
	log=`date +'%d/%m/%Y'`
	usu=`whoami`
	register="$ref;$day;$time;$fil;$col;$soli;$sec;$2;$3;$4;$5;$log;$usu"
	
# Se valida si existe el archivo reserva.nok, si no existe se lo crea	
	if [ -f "$GRUPO/$RESERVANOK" ];then
		echo $register >"$GRUPO/$RESERNOK"	
	else
		echo $register >>"$GRUPO/$RESERNOK"
	fi
}

updatedfilecombo(){
# Funcion que actualiza la disponibilidad de butacas en el archivo combos.dis
# Parametros de entrada
# $1 - Registro de contiene el combo a actualizar
# $2 - Nuevo valor de disponibilidad

# Se genera el registro actualizado con la nueva disponibilidad para modificar el existente
	idcombo=`echo $1 | cut -d';' -f1`
	idobra=`echo $1 | cut -d';' -f2`
	date=`echo $1 | cut -d';' -f3`
	time=`echo $1 | cut -d';' -f4`
	idsala=`echo $1 | cut -d';' -f5`
	buthab=`echo $1 | cut -d';' -f6`
	req=`echo $1 | cut -d';' -f8`	
	register="$idcombo;$idobra;$date;$time;$idsala;$buthab;$2;$req"

# Se ejecuta el comando SED para realizar la modificacion del combo
	sed 's#'$1'#'$register'#' -i "$GRUPO/$PROCDIR/$COMBOS"		
}

#----------------------------------------------------------------------------------------------------------------------
#
# Inicio del Comando Reservar_B
#
#---------------------------------------------------------------------------------------------------------------------
# Se determina la cantidad de archivos en el directorio ACEPDIR a procesar por el comando 
# Reserva_B. Antes se eliminan los archivos del sistema del tipo ~, si se lanza algun mensaje
# se lo re-edirecciona a null	
pathremuve="$GRUPO/$ACEPDIR/*[~]" 	
`rm $pathremuve 2> /dev/null`  
countacep=`ls "$GRUPO/$ACEPDIR/" | wc -l`

logGrabar="Reservar_B"
# Se inicia la ejecucion del comando Reserva_B. Se registra en el LOG el comando y la
# cantidad de archivos a procesar.
pid_reservar=`ps -e | grep -e 'Reservar_B.sh$' | awk '{print $1}'`
Grabar_L $logGrabar "Inicio Reservar_B: $pid_reservar - Cantidad de archivo a Procesar : $countacep" "I" 

# Se determina si existen archivos en el directorio. 
# - Si existen: Se procesan
# - Si no existen: Se termina la ejecucion del comando Reserva_B y se registra en el LOG 
if [ $countacep -gt 0 ]; then

# Se obtienen los archivos del directorio ACEPDIR para procesar por el comando Reserva_B
	filesacep=`ls "$GRUPO/$ACEPDIR/" -1` 	
 
# Se procesan todos los archivos del directorio ACEPDIR.
# Se inicializan las variables que cuentan la cantidad de reservas aceptadas y canceladas
	countok=0
	countnok=0
	
	for fileacep in $filesacep 
		do

# Se registra en el LOG el archivo a procesar por el comando Reserva_B.
			Grabar_L $logGrabar "Archivo a Procesar: $fileacep" "I" 

# Se verifica que el archivo no haya sido procesado, verificar duplicados (3)
# Si fue procesado, se lo mueve tal cual fue recibido y con el mismo nombre al directorio
# PROCDIR y se lo registra en el LOG. Antes se eliminan los archivos del sistema del tipo ~, 
# si se lanza algun mensaje se lo re-edirecciona a null	
			pathremuve="$GRUPO/$PROCDIR/*[~]" 	
			`rm $pathremuve 2> /dev/null`  
			countproc=`ls "$GRUPO/$PROCDIR/" | grep -w "$fileacep" | wc -l`
			
			if [ $countproc -eq 0 ]; then
				
# Se verifica que el archivo a procesar no este vacio (4)
				pathfile="$GRUPO/$ACEPDIR/$fileacep"
				pathrech="$GRUPO/$RECHDIR/$fileacep"

				if [ ! -s "$pathfile" ];then
					Grabar_L $logGrabar "Se Rechaza este archivo $fileacep por estar VACIO" "E"
					Mover_B "$pathfile" "$pathrech" $logGrabar
					continue
				fi

# Se verifica el formato del archivo. Los registros tiene que ser del tipo: 
# X..X;XX/XX/XX;XX:XX;X..X;X..X;X..X;X..X .Para realizar esta validacion, se toma en cuenta
# que la cantidad del separador de campos sea 6. Si un registro no tiene el formato establecido
# se rechaza el archivo.
				pathfile="$GRUPO/$ACEPDIR/$fileacep"				
				pathrech="$GRUPO/$RECHDIR/$fileacep"				
				validformat=0
				for reserva in `cat "$pathfile"`
					do
						format=`echo $reserva | grep -oh ';' | wc -l`
						if [ $format -ne 6 ];then
							validformat=1	
						fi
					done
				 
				if [ $validformat -eq 1 ];then
					Grabar_L $logGrabar "Se Rechaza este archivo $fileacep por tener un formato INVALIDO" "E" 
					Mover_B "$pathfile" "$pathrech" $logGrabar
					continue
				fi

# Si se verifican validaciones del punto 4, entonces se leen los registro de los archivo de 
# reserva del directorio ACEPDIR
				pathfile="$GRUPO/$ACEPDIR/$fileacep"
				for reserva in `cat "$pathfile"`
					do

# Se obtiene el id de la obra o sala para ser registrado en el log de reservas.nok en caso de error.
						idfile=`echo "$fileacep" | cut -d'-' -f1`
						res=`expr $idfile % 2`
						if [ $res -eq 0 ];then
							idsala=$idfile
							idobra="Falta Obra"
						else
							idsala="Falta Sala" 
							idobra=$idfile
						fi

# Se verifica la fecha de la funcion solicitada (5.1.a). Si falla en la validacion se cancela
# la reserva, agregando un registro en el archivo reserva.nok
						validdate=`echo "$reserva" | cut -d';' -f2 | grep -w '../../....' | wc -l`
						if [ $validdate -eq 0 ]; then
							correo=`echo "$fileacep" | cut -d'-' -f2`
 							writereservasnok "$reserva" "Fecha Invalida" "$idsala" "$idobra" $correo
							countnok=`expr $countnok + 1`							
							continue  
						fi

# Para las siguiente validaciones, se toma la fecha actual y se la compara con la fecha 
# solicitada que se obtiene del registro de reserva. Para facilitar las comparaciones se 
# pasan las fechas al formato yyyymmdd.
						actualday=`date +'%Y%m%d'`
						nextday=`date -d '+1 day' +'%Y%m%d'`
						nextmonth=`date -d '+1 month' +'%Y%m%d'`

						funtday=`echo $reserva | cut -d';' -f2` 											
						day=`echo $funtday | cut -d'/' -f1`
						month=`echo $funtday | cut -d'/' -f2`	 					
						year=`echo $funtday | cut -d'/' -f3`
						
						functionday="$year$month$day" 
							 
# Se verifica la fecha de la funcion solicitada no este vencida (5.1.b). Fecha solicitada, 
# menor fecha actual. Si falla en la validacion se cancela la reserva, agregando un registro
# en el archivo reserva.nok
						if [ $functionday -lt $actualday ]; then
							correo=`echo "$fileacep" | cut -d'-' -f2`
 							writereservasnok "$reserva" "Reserva Vencida" "$idsala" "$idobra" $correo
							countnok=`expr $countnok + 1`
							continue
						fi

# Se verifica la fecha de la funcion solicitada no sea del mismo dia de la funcion (5.1.b).
# Si falla en la validacion se cancela la reserva, agregando un registro en el archivo reserva.nok
						if [ $functionday -eq $actualday ]; then
							correo=`echo "$fileacep" | cut -d'-' -f2`
							writereservasnok "$reserva" "Reserva Tardia" "$idsala" "$idobra" $correo
							countnok=`expr $countnok + 1`
							continue
						fi

# Se verifica la fecha de la funcion solicitada no sea del dia siguiente a la funcion (5.1.b).
# Si falla en la validacion se cancela la reserva, agregando un registro en el archivo reserva.nok						
						if [ $functionday -eq $nextday ]; then
							correo=`echo $fileacep | cut -d'-' -f2`
 							writereservasnok "$reserva" "Reserva Tardia" "$idsala" "$idobra" $correo
							countnok=`expr $countnok + 1`
							continue
						fi

# Se verifica la fecha de la funcion solicitada no sea mayor a un mes (5.1.b).
# Si falla en la validacion se cancela la reserva, agregando un registro en el archivo reserva.nok						
						if [ $functionday -gt $nextmonth ]; then
							correo=`echo "$fileacep" | cut -d'-' -f2`
  							writereservasnok "$reserva" "Reserva Anticipada. Aun no se pueden confirmar reservas para esta funcion" "$idsala" "$idobra" $correo
							countnok=`expr $countnok + 1`
							continue
						fi

# Se verifica que el formato de la hora de la funcion sea valido: hh:mm (5.2).
# Si falla en la validacion se cancela la reserva, agregando un registro en el archivo reserva.nok
						validtime=`echo "$reserva" | cut -d';' -f3 | grep -w '..:..' | wc -l`
						if [ $validtime -eq 0 ]; then
							correo=`echo "$fileacep" | cut -d'-' -f2`
  							writereservasnok "$reserva" "Hora Invalida" "$idsala" "$idobra" $correo
							countnok=`expr $countnok + 1`
							continue	
						fi

# Se verifica la existencia del evento (5.3). Se obtiene el id de la obra o id de la sala 
# (depende del archivo), el dia y hora
						id=`echo "$fileacep" | cut -d'-' -f1`
						day=$funtday
						time=`echo $reserva | cut -d';' -f3`

# Se verifica si existe un combo en el archivo de disponibilidad. Si existe, se procesa el
# registro de reserva, sino se cancela la reserva, agregando un registro en el archivo reserva.nok 

# Se verifica si se trata de una reserva de obra (id impar) o sala (id par)
						res=`expr $id % 2`
						existevent=0
						pathcombos="$GRUPO/$PROCDIR/$COMBOS"

						if [ $res -eq 0 ];then
 
							for combo in `cat "$pathcombos"`
								do
# Se verifica el id de la sala, la fecha y hora de la funcion del combo, contra el registro
# de reserva a procesar.									
									idsalacombo=`echo $combo | cut -d';' -f5`
									if [ $id -eq $idsalacombo ];then

										daycombovalid=`echo $combo | grep -w $day | wc -l`
										if [ $daycombovalid -eq 1 ]; then

											timecombovalid=`echo $combo | grep -w $time | wc -l`
											if [ $timecombovalid -eq 1 ]; then
# Se obtiene el ID del combo para procesar.
												idcombo=`echo $combo | cut -d';' -f1`
												existevent=1
											else
												continue
											fi						
										else
											continue
										fi

									else
										continue
									fi		
								done
						else

							for combo in `cat "$pathcombos"`
								do
# Se verifica el id de la obra, la fecha y hora de la funcion, contra el registro
# de reserva a procesar.
									idobracombo=`echo $combo | cut -d';' -f2`
									if [ $id -eq $idobracombo ];then
										
										daycombovalid=`echo $combo | grep -w $day | wc -l`
										if [ $daycombovalid -eq 1 ]; then

											timecombovalid=`echo $combo | grep -w $time | wc -l` 
												if [ $timecombovalid -eq 1 ]; then
# Se obtiene el ID del combo para procesar.
													idcombo=`echo $combo | cut -d';' -f1`
													existevent=1
											else
												continue
											fi						
										else
											continue
										fi

									else
										continue
									fi		
								done
						fi
# Se verifica la existencia del combo, para los datos del registro a procesar.
# Si existe, se verifica la disponibilidad. Sino se cancela la reserva, agregando un registro
# en el archivo reserva.nok
 
						if [ $existevent -eq 1 ];then

# Se obtiene el combo y se verifica disponibilidad
							combo=`cat "$pathcombos" | grep -w $idcombo`
							disp=`echo $combo | cut -d';' -f7`
							soli=`echo $reserva | cut -d';' -f6`

# Se valida que hayan butacas disponibles
							if [ $disp -gt 0 ]; then

# Se valida si se puede tomar la cantidad de butacas a reservar
								if [ $disp -gt $soli ]; then

# Se generan las variables para guardar el registro en el archivo reserva.ok
									pathobras="$GRUPO/$MAEDIR/$MAEOBRAS"
									pathsalas="$GRUPO/$MAEDIR/$MAESALAS"
									dispact=`expr $disp - $soli`

									idobra=`echo $combo | cut -d';' -f2`
									nameobra=`cat "$pathobras" | grep -w $idobra | cut -d';' -f2`
									idsala=`echo $combo | cut -d';' -f5`
									namesala=`cat "$pathsalas" | grep -w $idsala | cut -d';' -f2`
									correo=`echo "$fileacep" | cut -d';' -f2`
									writereservasok $idobra "$nameobra" "$reserva" $idsala "$namesala" $soli $idcombo $correo
										
# Se actualiza la disponibilidad en el archivo combos.dis
									combo=`cat "$pathcombos" | grep -w $idcombo`										
									updatedfilecombo $combo $dispact
									countok=`expr $countok + 1`

# Se registra en el LOG la modificacion del archivo combos.dis
									Grabar_L $logGrabar "Se ha actualizado disponibilidad en el archivo combos.dis" "I" 					
						 		else
# No hay disponibilidad suficiente para tomar la reserva. Se cancela la reserva, agregando 
# un registro en el archivo reserva.nok 
									idobra=`echo $combo | cut -d';' -f2`
									idsala=`echo $combo | cut -d';' -f5`
									correo=`echo "$fileacep" | cut -d'-' -f2`
  									writereservasnok "$reserva" "Falta de Disponibilidad" $idobra $idsala $correo
									countnok=`expr $countnok + 1`										
									continue
								fi
									
							else
# No hay disponibilidad suficiente para tomar la reserva. Se cancela la reserva, agregando 
# un registro en el archivo reserva.nok 
								idobra=`echo $combo | cut -d';' -f2`
								idsala=`echo $combo | cut -d';' -f5`
								correo=`echo "$fileacep" | cut -d'-' -f2`
  								writereservasnok "$reserva" "Falta de Disponibilidad" $idobra $idsala $correo
								countnok=`expr $countnok + 1`										
								continue
							fi

						else
# No existe el evento solicitado. Se cancela la reserva, agregando un registro en el archivo 
# reserva.nok 
							correo=`echo "$fileacep" | cut -d'-' -f2`
  							writereservasnok "$reserva" "No existe el evento Solicitado" "$idsala" "$idobra" $correo
							countnok=`expr $countnok + 1`										
							continue								
						fi		

					done

# Archivo procesado. Guardar en el LOG
				Grabar_L $logGrabar "El archivo $fileacep fue procesado" "I"
				pathfile="$GRUPO/$ACEPDIR/$fileacep"				
				pathproc="$GRUPO/$PROCDIR/$fileacep"
				Mover_B "$pathfile" "$pathproc" $logGrabar

			else
				Grabar_L $logGrabar "Se Rechaza este archivo $fileacep por estar DUPLICADO" "E"
				pathfile="$GRUPO/$ACEPDIR/$fileacep"				
				pathrech="$GRUPO/$RECHDIR/$fileacep"
				Mover_B "$pathfile" "$pathrech" $logGrabar
				continue
			fi
			  			
		done	

# Se han procesado todos los archivos del directorio ACEPDIR. Fin del comando Reserva_B
	Grabar_L $logGrabar "Se confirmaron $countok Reservas - Ver archivo reservas.ok" "I"
	Grabar_L $logGrabar "Se cancelaron $countnok Reservas - Ver archivo reservas.nok" "I"
	Grabar_L $logGrabar "Fin Reservar_B" "I"
else
# No hay archivos en el directorio ACEPDIR. Fin del comando Reserva_B
	Grabar_L $logGrabar "Fin Reservar_B" "I"
fi



